package com.lagou.firstStageFourthModel.Fourth;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 使用基于 tcp 协议的编程模型实现将 UserMessage 类型对象由客户端发送给服务器；
 * 服 务 器接 收到 对象 后判 断 用户 对象 信息 是否 为 "admin" 和 "123456"，
 * 若是则将 UserMessage 对象中的类型改为"success"，否则将类型改为"fail"并回发给客户端，
 * 客户端接收到服务器发来的对象后判断并给出登录成功或者失败的提示。
 * 其中 UserMessage 类的特征有：类型(字符串类型) 和 用户对象(User 类型)。
 * 其中 User 类的特征有：用户名、密码(字符串类型)。
 */
public class ServerTest {
    public static void main(String[] args) {
        ServerSocket ss = null;
        Socket s = null;
        ObjectInputStream ois = null;
        ObjectOutputStream oos = null;

        try {
            ss = new ServerSocket(8888);

            while (true) {
                System.out.println("等待客户端的连接请求...");
                // 等待客户端的连接请求，调用accept方法
                s = ss.accept();

                ois = new ObjectInputStream(s.getInputStream());
                oos = new ObjectOutputStream(s.getOutputStream());

                System.out.println("客户端"+ s.getInetAddress() +"连接成功!");

                // 接收客户端提交内容
                Object obj = ois.readObject();

                UserMessage um;

                if (obj instanceof UserMessage) {
                    um = (UserMessage) obj;
                    User user = um.getUser();
                    if ("123456".equals(user.getPassword()) && "admin".equals(user.getUserName()) && "check".equals(um.getType())) {
                        um.setType("success");
                        System.out.println("登录成功!");
                    } else {
                        um.setType("fail");
                        System.out.println("登录失败!");
                    }
                } else {
                    um = new UserMessage("fail", new User());
                    System.out.println("登录失败!");
                }

                // 向客户端发送UserMessage对象
                oos.writeObject(um);

            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 关闭并释放有关资源
            if (null != oos) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != ois) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != s) {
                try {
                    s.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != ss) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
